package com.tvunetworks.device.extra.util;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;

/**
 * @author Liam
 */
public final class RandomUtils {
    private static final String[] CHARS = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,1,2,3,4,5,6,7,8,9,0"
            .split(",");

    private RandomUtils() {
    }

    /**
     * 获取指定长度的随机字符串
     * @param size 长度
     * @return 随机字符串
     */
    public static String getRandomStr(int size) {
        StringBuilder b = new StringBuilder();
        for (int i = 0; i < size; i++) {
            int k = ThreadLocalRandom.current().nextInt(0, CHARS.length);
            b.append(CHARS[k]);
        }
        return b.toString();
    }

    /**
     * 获得一个[0,max)之间的整数。
     *
     * @param max 最大值
     * @return 随机数
     */
    public static int getRandomInt(int max) {
        return ThreadLocalRandom.current().nextInt(0, max);
    }

    /**
     * 从list中随机取得一个元素
     * @param <E> 通配符
     * @param list list
     * @return 取得随机元素
     */
    public static <E> E getRandomElement(List<E> list) {
        return list.get(getRandomInt(list.size()));
    }

    /**
     * 从set中随机取得一个元素
     * @param <E> 通配符
     * @param set set
     * @return 取得随机元素
     */
    public static <E> E getRandomElement(Set<E> set) {
        int rn = getRandomInt(set.size());
        int i = 0;
        for (E e : set) {
            if (i == rn) {
                return e;
            }
            i++;
        }
        return null;
    }

    /**
     * 从map中随机取得一个key
     * @param <K> 通配符
     * @param <V> 通配符
     * @param map map
     * @return 取得随机key
     */
    public static <K, V> K getRandomKeyFromMap(Map<K, V> map) {
        int rn = getRandomInt(map.size());
        int i = 0;
        for (K key : map.keySet()) {
            if (i == rn) {
                return key;
            }
            i++;
        }
        return null;
    }

    /**
     * 从map中随机取得一个value
     * @param <K> 通配符
     * @param <V> 通配符
     * @param map map
     * @return 获得随机value
     */
    public static <K, V> V getRandomValueFromMap(Map<K, V> map) {
        int rn = getRandomInt(map.size());
        int i = 0;
        for (V value : map.values()) {
            if (i == rn) {
                return value;
            }
            i++;
        }
        return null;
    }

}